dialog: Avoid a memory leak in an error case
authorMatthias Clasen <mclasen@redhat.com>
Fri, 26 Feb 2016 19:50:25 +0000 (14:50 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 26 Feb 2016 20:52:19 +0000 (15:52 -0500)
Parsing <action-widgets> could sometimes fail to free
some of the data, if a nonexisting widget is referenced.
Found by gcc's leak sanitizer.

gtk/gtkdialog.c

index ad1828ad6217cc714bf013efa5c7c69f1696b1a4..45dc5bef03ff996e6b17bd79ac69244edc14c04e 100644 (file)
@@ -1687,6 +1687,15 @@ typedef struct {
   gint col;
 } SubParserData;
 
+static void
+free_action_widget_info (gpointer data)
+{
+  ActionWidgetInfo *item = data;
+
+  g_free (item->widget_name);
+  g_free (item);
+}
+
 static void
 parser_start_element (GMarkupParseContext *context,
                       const gchar         *element_name,
@@ -1894,12 +1903,9 @@ gtk_dialog_buildable_custom_finished (GtkBuildable *buildable,
 
       if (item->is_default)
         gtk_widget_grab_default (GTK_WIDGET (object));
-
-      g_free (item->widget_name);
-      g_free (item);
     }
 
-  g_slist_free (data->items);
+  g_slist_free_full (data->items, free_action_widget_info);
   g_string_free (data->string, TRUE);
   g_slice_free (SubParserData, data);